const express = require('express');
const app = express(); //创建一个express应用

//中间价 就是 处理函数
// 不写 第一个参数 处理所有  请求 get post 都可以匹配
// app.use(require('./staticMiddleware'));

// 也可以这么写 app.get(path,fn1,fn2,fn3)
app.get('/news/abc', (req, res, next) => {
  console.log('handler1');
  // throw new Error("abc")
  // 相当于 next(new Error("abc"))
  // next 就是后续的处理函数
  next(new Error('abc'));
  // next();
});

// 要是 一直 next 没有 设置 end send 到最后 express 会自动 设置 404

//能匹配  /news  /news/abc   /news/123   /news/ab/adfs
//不能匹配  /n   /a   /   /newsabc
// 后续的处理函数
// 通常这么使用中间价 ！
app.use('/news', require('./errorMiddleware'));
// 要是 一直 next 没有 设置 end send 到最后 express 会自动 设置 404
// app.use('/news', (req, res, next) => {
//   next();
// });

app.get(
  '/aaa',
  (req, res, next) => {
    next(1111);
  },
  (err, req, res, next) => {
    // 错误处理中间件

    // 错误处理中间件总是需要四个参数。你必须提供四个参数以将其标识为错误处理中间件函数。即使你不需要使用 next 对象，你也必须指定它来维护签名。否则，next 对象将被解释为常规中间件，无法处理错误。有关错误处理中间件的详细信息，请参见：错误处理。
    // 以与其他中间件函数相同的方式定义错误处理中间件函数，除了使用四个参数而不是三个参数，特别是使用签名 (err, req, res, next))：
    console.log(err, 'log1');
    res.send('aaa');
  }
);

const port = 5008;
app.listen(port, () => {
  console.log(`server listen on ${port}`);
});
